package com.library.config;

import com.library.entity.Book;
import com.library.entity.User;
import com.library.repository.BookRepository;
import com.library.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.CommandLineRunner;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

/**
 * 数据初始化器
 * 在应用启动时自动执行，初始化默认数据（管理员账户、测试用户、示例图书）
 * 只在数据库为空时执行，避免重复初始化
 */
@Component
@RequiredArgsConstructor
public class DataInitializer implements CommandLineRunner {
    // 用户数据访问层
    private final UserRepository userRepository;
    // 图书数据访问层
    private final BookRepository bookRepository;
    // 密码加密器，用于加密默认账户密码
    private final PasswordEncoder passwordEncoder;

    /**
     * 应用启动时执行的方法
     * 初始化用户和图书数据
     * 
     * @param args 命令行参数
     */
    @Override
    public void run(String... args) {
        initializeUsers();
        initializeBooks();
    }

    /**
     * 初始化用户数据
     * 创建默认管理员账户和测试用户账户
     * 只在用户表为空时执行
     */
    private void initializeUsers() {
        // 检查是否已有用户，避免重复初始化
        if (userRepository.count() == 0) {
            // 创建管理员账户
            User admin = new User();
            admin.setUsername("admin");
            // 使用BCrypt加密密码
            admin.setPassword(passwordEncoder.encode("admin123"));
            admin.setRole("admin");
            userRepository.save(admin);
            System.out.println("默认管理员账户已创建: admin/admin123");

            // 创建测试用户
            User user = new User();
            user.setUsername("user");
            // 使用BCrypt加密密码
            user.setPassword(passwordEncoder.encode("user123"));
            user.setRole("user");
            userRepository.save(user);
            System.out.println("测试用户账户已创建: user/user123");
        }
    }

    /**
     * 初始化图书数据
     * 创建示例图书数据
     * 只在图书表为空时执行
     */
    private void initializeBooks() {
        // 检查是否已有图书，避免重复初始化
        if (bookRepository.count() == 0) {
            // 创建示例图书列表
            List<Book> books = Arrays.asList(
                    createBook("JavaScript高级程序设计", "Matt Frisbie", "9787115545381", "技术", 5, true),
                    createBook("Vue.js设计与实现", "霍春阳", "9787115583864", "技术", 3, true),
                    createBook("Node.js实战", "Mike Cantelon", "9787115369338", "技术", 2, false),
                    createBook("百年孤独", "加西亚·马尔克斯", "9787544253994", "文学", 4, true),
                    createBook("三体", "刘慈欣", "9787536692930", "科幻", 6, false)
            );
            // 批量保存图书
            bookRepository.saveAll(books);
            System.out.println("示例图书已创建");
        }
    }

    /**
     * 创建图书对象的辅助方法
     * 
     * @param title 书名
     * @param author 作者
     * @param isbn ISBN号
     * @param category 分类
     * @param stock 库存
     * @param recommended 是否推荐
     * @return Book对象
     */
    private Book createBook(String title, String author, String isbn, String category, Integer stock, Boolean recommended) {
        Book book = new Book();
        book.setTitle(title);
        book.setAuthor(author);
        book.setIsbn(isbn);
        book.setCategory(category);
        book.setStock(stock);
        book.setIsRecommended(recommended);
        return book;
    }
}
